#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> //hostent
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

#include "config.h"
#include "socket.h"

/* Damit inet_aton() deklariert wird */
#define _BSD_SOURCE
#define BUF 256


 /*
  * Dieses Unterprogramm erledigt den Verbindungsaufbau zu einem vordefinierten Spielserver.
  * Hierbei wird zunächst die URL aufgelöst und schließlich ein Socket eingerichtet der
  * die Kommunikation ermöglicht.
  */


int sock;
  
  /* Auflösen der URL. */
  int Hostname_zu_IP(char *hostname , char *ip) {
    struct addrinfo hints, *servinfo, *p;
    struct sockaddr_in *h;
    int rv;
 
    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM;
 
    if ((rv = getaddrinfo(hostname, "http", &hints, &servinfo)) != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
        return 1;
    }
 

    for(p = servinfo; p != NULL; p = p->ai_next) {
        h = (struct sockaddr_in *) p->ai_addr;
        strcpy(ip , inet_ntoa( h->sin_addr ) );
    }
     
    freeaddrinfo(servinfo); 
    return 0;
}



int Verbindung_herstellen() {

  char ip[100];

  printf("Initialisiere\n\n");


  /* Socket vorbereiten. */
  struct sockaddr_in address;
  sock = socket(AF_INET, SOCK_STREAM, 0); 
  address.sin_family = AF_INET;
  address.sin_port = htons(konf.Portnummer);
  
  
  Hostname_zu_IP(konf.Hostname, ip);			//Auflösen der URL
  inet_aton(ip, &address.sin_addr);		


  /* Verbindung zum Server aufbauen und ggf. Fehler werfen */
  if (connect(sock, (struct sockaddr*) &address, sizeof(address)) == 0)  {
      printf("Verbindung mit %s hergestellt.\n", inet_ntoa(address.sin_addr));
  }
  else {
    printf("Verbindung konnte nicht hergestellt werden");
  }

 return sock;
}


void Verbindung_beenden() {
    close(sock);
}
